package main

import (
	"fmt"
	"time"
)

/**
什么是goroutine?

goroutine是Go语言并行设计的核心，有人称之为go程。
Goroutine从量级上看很像协程，它比线程更小，十几个goroutine可能体现在底层就是五六个线程，Go语言内部帮你实现了这些goroutine之间的内存共享。
执行goroutine只需极少的栈内存(大概是4~5KB)，当然会根据相应的数据伸缩。也正因为如此，可同时运行成千上万个并发任务。
goroutine比thread更易用、更高效、更轻便。

一般情况下，一个普通计算机跑几十个线程就有点负载过大了，但是同样的机器却可以轻松地让成百上千个goroutine进行资源竞争。
*/

/**
创建goroutine:

只需在函数调⽤语句前添加 go 关键字，就可创建并发执⾏单元。开发⼈员无需了解任何执⾏细节，调度器会自动将其安排到合适的系统线程上执行。
在并发编程中，我们通常想将一个过程切分成几块，然后让每个goroutine各自负责一块工作，当一个程序启动时，主函数在一个单独的goroutine中运行，我们叫它main goroutine。
新的goroutine会用go语句来创建。而go语言的并发设计，让我们很轻松就可以达成这一目的。
*/

//func main() {
//	//创建一个goroutine,启动另外一个任务
//	go newTask()
//	//i := 0
//	//for {
//	//	i++
//	//	fmt.Printf("main goroutine i=%d\n", i)
//	//	time.Sleep(time.Second * 1)
//	//}
//	/** 主goroutine退出后，其它的工作goroutine也会自动退出：*/
//	// fmt.Println("main goroutine exit")
//
//}

func newTask() {
	var i int = 0
	for {
		i++
		fmt.Printf("new gorutine i=%d\n", i)
		time.Sleep(time.Second * 1)
	}
}
